home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / program / gtld3656.lha / GadUtil / Examples / BetterTest-C / BetterTest.c < prev    next >
C/C++ Source or Header  |  1995-01-16  |  12KB  |  423 lines

  1. /*------------------------------------------------------------------------**
  2. **              My gadutil.library example translated into C              **
  3. **                                          P-O Yliniemi 24-Dec-94        **
  4. **------------------------------------------------------------------------*/
  5. #define INTUI_V36_NAMES_ONLY
  6.  
  7. #include <exec/types.h>
  8. #include <exec/execbase.h>
  9. #include <intuition/intuition.h>
  10. #include <intuition/gadgetclass.h>
  11. #include <libraries/gadtools.h>
  12.  
  13. #include <libraries/gadutil.h>
  14. #include <proto/gadutil.h>
  15.  
  16. #include <clib/dos_protos.h>
  17. #include <clib/exec_protos.h>
  18. #include <clib/intuition_protos.h>
  19. #include <clib/gadtools_protos.h>
  20.  
  21. #include <stdio.h>
  22.  
  23. #ifdef LATTICE
  24. int CXBRK(void)     { return(0); }
  25. int chkabort(void)  { return(0); }
  26. #endif
  27.  
  28. extern struct ExecBase *SysBase;
  29.  
  30. /*-------------------- Data for localizing of the program ----------------*/
  31. #define DRIVE_MX_GAD    11
  32.  
  33. #define MSG_NEXTDRIVE    0
  34. #define MSG_PREVDRIVE    1
  35. #define MSG_DRIVE        2
  36. #define MSG_CHECKME        3
  37. #define MSG_REQUESTER    4
  38. #define MSG_FILENAME    5
  39. #define MSG_INTEGER        6
  40. #define MSG_DRAGME        7
  41. #define MSG_SCROLLME    8
  42. #define MSG_SELECTITEM    9
  43. #define MSG_SELECTCOL    10
  44.  
  45. #define MNU_1_TITLE        100
  46. #define MNI_1_IT1        101
  47. #define MNI_1_IT2        102
  48. #define MNI_1_IT3        103
  49. #define MNS_1_IT3_1        104
  50. #define MNS_1_IT3_2        105
  51. #define MNI_1_IT4        106
  52.  
  53. static const struct AppString AppStrings[] =
  54. {
  55.     {MSG_NEXTDRIVE, (ULONG)"_Next drive"},
  56.     {MSG_PREVDRIVE, (ULONG)"_Prev drive"},
  57.     {MSG_DRIVE, (ULONG)"_Drive"},
  58.     {MSG_CHECKME, (ULONG)"C_heck me:"},
  59.     {MSG_REQUESTER, (ULONG)"_Requester"},
  60.     {MSG_FILENAME, (ULONG)"_Filename:"},
  61.     {MSG_INTEGER, (ULONG)"_Integer:"},
  62.     {MSG_DRAGME, (ULONG)"Dra_g me:"},
  63.     {MSG_SCROLLME, (ULONG)"Scr_oll me:"},
  64.     {MSG_SELECTITEM, (ULONG)"_Select an item:"},
  65.     {MSG_SELECTCOL, (ULONG)"Select _Color:"},
  66.     {MNU_1_TITLE, (ULONG)" \0Project"},
  67.     {MNI_1_IT1, (ULONG)"O\0Open..."},
  68.     {MNI_1_IT2, (ULONG)"S\0Save"},
  69.     {MNI_1_IT3, (ULONG)" \0Print"},
  70.     {MNS_1_IT3_1, (ULONG)" \0Draft"},
  71.     {MNS_1_IT3_2, (ULONG)" \0NLQ"},
  72.     {MNI_1_IT4, (ULONG)"Q\0Quit"},
  73. };
  74.  
  75. #define catalogname "BetterTest.catalog"
  76.  
  77. /*----------------------- End of localizing datas ------------------------*/
  78.  
  79. struct TagItem layoutmenutags[] = {
  80.     {GTMN_NewLookMenus,    TRUE},
  81.     {TAG_DONE}
  82. };
  83.  
  84. #define LEFT_OFFSET    6
  85. #define TOP_OFFSET    3
  86.  
  87. struct TagItem StdGTTags[] = {
  88.     {GT_Underscore, '_'},
  89.     {TAG_DONE}
  90. };
  91.  
  92. struct TagItem StdButtonTags[] = {
  93.     {GU_Flags,    PLACETEXT_IN},    {GU_LabelHotkey,    TRUE},    {TAG_DONE}
  94. };
  95.  
  96. struct TagItem StdGadTags[] = {
  97.     {GU_LabelHotkey,    TRUE},    {TAG_DONE}
  98. };
  99.  
  100. struct TagItem NextDriveGad[] = {
  101.     {GU_GadgetKind,    BUTTON_KIND},    {GU_LocaleText,    MSG_NEXTDRIVE},
  102.     {GU_Left,        LEFT_OFFSET},    {GU_Top,        TOP_OFFSET},
  103.     {GU_AutoHeight,    4},                {GU_AutoWidth,    20},
  104.     {TAG_MORE,        (ULONG)StdButtonTags}
  105. };
  106.  
  107. struct TagItem PrevDriveGad[] = {
  108.     {GU_GadgetKind,    BUTTON_KIND},    {GU_LocaleText,    MSG_PREVDRIVE},
  109.     {GU_DupeWidth,    MSG_NEXTDRIVE},    {GU_LeftRel,    MSG_NEXTDRIVE},
  110.     {GU_AddLeft,    INTERWIDTH},    {TAG_MORE,        (ULONG)StdButtonTags}
  111. };
  112.  
  113. struct TagItem DriveGad[] = {
  114.     {GU_GadgetKind,    CYCLE_KIND},    {GU_LocaleText,    MSG_DRIVE},
  115.     {GU_TopRel,        MSG_PREVDRIVE},    {GU_AddTop,        INTERHEIGHT},
  116.     {GU_Flags,        PLACETEXT_LEFT},{TAG_MORE,        (ULONG)StdGadTags}
  117. };
  118.  
  119. APTR CycleText[] = { "DF0:", "DF1:", "DF2:", "DF3:", NULL };
  120.  
  121. struct TagItem DriveGTTags[] = {
  122.     {GTCY_Labels,    (ULONG)CycleText},    {TAG_MORE,        (ULONG)StdGTTags}
  123. };
  124.  
  125. struct TagItem ReqGad[] = {
  126.     {GU_GadgetKind,    BUTTON_KIND},    {GU_LocaleText,        MSG_REQUESTER},
  127.     {GU_TopRel,        MSG_DRIVE},        {GU_AddTop,            INTERHEIGHT},
  128.     {TAG_MORE,        (ULONG)StdButtonTags}
  129. };
  130.  
  131. struct TagItem CheckBoxGad[] = {
  132.     {GU_Width,        CHECKBOX_WIDTH},{GU_Height,        CHECKBOX_HEIGHT},
  133.     {GU_GadgetKind,    CHECKBOX_KIND},    {GU_LocaleText,    MSG_CHECKME},
  134.     {GU_AlignRight,    MSG_NEXTDRIVE},    {GU_Flags,        PLACETEXT_LEFT},
  135.     {TAG_MORE,        (ULONG)StdGadTags}
  136. };
  137.  
  138. struct TagItem FileNameGad[] = {
  139.     {GU_GadgetKind,    STRING_KIND},    {GU_TopRel,        MSG_REQUESTER},
  140.     {GU_LocaleText,    MSG_FILENAME},    {GU_AutoHeight,    4},
  141.     {GU_AlignLeft,    MSG_CHECKME},    {GU_AlignRight,    DRIVE_MX_GAD},
  142.     {GU_AddTop,        INTERHEIGHT},    {GU_AddWidth,    4},
  143.     {TAG_MORE,        (ULONG)StdGadTags}
  144. };
  145.  
  146. struct TagItem IntegerGad[] = {
  147.     {GU_GadgetKind,    INTEGER_KIND},    {GU_TopRel,        MSG_FILENAME},
  148.     {GU_LocaleText,    MSG_INTEGER},    {GU_AddTop,        INTERHEIGHT},
  149.     {TAG_MORE,        (ULONG)StdGadTags}
  150. };
  151.  
  152. struct TagItem DriveMxGad[] = {
  153.     {GU_GadgetKind,    MX_KIND},        {GU_AlignTop,    MSG_NEXTDRIVE},
  154.     {GU_Width,        MX_WIDTH},        {GU_Height,        MX_HEIGHT},
  155.     {GU_AdjustTop,    2},                {GU_Flags,        PLACETEXT_LEFT|NG_HIGHLABEL},
  156.     {GU_LeftRel,    MSG_PREVDRIVE},    {GU_AddLeftChar,7},
  157.     {GU_GadgetText, (ULONG)"Driv_e"},{GU_LabelHotkey,    TRUE},
  158.     {TAG_DONE}
  159. };
  160.  
  161. struct TagItem MXGadGTTags[] = {
  162.     {GTMX_Labels,    (ULONG)CycleText},    {GTMX_Spacing,    2},
  163.     {GTMX_Active,    2},                {TAG_DONE}
  164. };
  165.  
  166. struct TagItem SliderGad[] = {
  167.     {GU_GadgetKind,    SLIDER_KIND},    {GU_AlignLeft,    MSG_FILENAME},
  168.     {GU_AlignRight,    MSG_FILENAME},    {GU_AutoHeight,    4},
  169.     {GU_TopRel,        MSG_INTEGER},    {GU_AddTop,        INTERHEIGHT},
  170.     {GU_AddWidth,    -13},            {GU_Flags,        PLACETEXT_LEFT},
  171.     {GU_LocaleText,    MSG_DRAGME},    {TAG_MORE,        (ULONG)StdGadTags}
  172. };
  173.  
  174. struct TagItem SliderGTTags[] = {
  175.     {GTSL_Min,        -50},            {GTSL_Max,        50},
  176.     {GTSL_Level,    10},            {GTSL_MaxLevelLen, 3},
  177.     {GTSL_LevelFormat,    (ULONG)"%3ld"},
  178.     {GTSL_LevelPlace,    PLACETEXT_RIGHT},
  179.     {TAG_MORE,            (ULONG)StdGTTags}
  180. };
  181.  
  182. struct TagItem ListViewGad[] = {
  183.     {GU_GadgetKind,    LISTVIEW_KIND},    {GU_AlignTop,    MSG_DRIVE},
  184.     {GU_AlignBottom,MSG_INTEGER},    {GU_LocaleText,    MSG_SELECTITEM},
  185.     {GU_LeftRel,    MSG_INTEGER},    {GU_Columns,    26},
  186.     {GU_Flags,        PLACETEXT_ABOVE|NG_HIGHLABEL},
  187.     {GU_AddLeft,    10},            {TAG_MORE,        (ULONG)StdGadTags}
  188. };
  189.  
  190. struct TagItem LVGTTags[] = {
  191.     {GTLV_Labels,    NULL},            {GTLV_ShowSelected,    -1L},
  192.     {TAG_MORE,        (ULONG)StdGTTags}
  193. };
  194.  
  195. struct TagItem ScrollGad[] = {
  196.     {GU_GadgetKind,    SCROLLER_KIND},    {GU_LocaleText,    MSG_SCROLLME},
  197.     {GU_AlignLeft,    MSG_DRAGME},    {GU_AlignRight,    MSG_INTEGER},
  198.     {GU_TopRel,        MSG_DRAGME},    {GU_AddTop,        INTERHEIGHT},
  199.     {GU_Flags,        PLACETEXT_LEFT},{GU_AddWidth,    20},
  200.     {GU_DupeHeight,    MSG_DRAGME},    {TAG_MORE,        (ULONG)StdGadTags}
  201. };
  202.  
  203. struct TagItem ScrollGTTags[] = {
  204.     {GTSC_Top,        110},            {GTSC_Total,    9},
  205.     {GTSC_Visible,    5},                {GTSC_Arrows,    16},
  206.     {TAG_MORE,        (ULONG)StdGTTags}
  207. };
  208.  
  209. struct TagItem PaletteGad[] = {
  210.     {GU_GadgetKind,    PALETTE_KIND},    {GU_LocaleText,    MSG_SELECTCOL},
  211.     {GU_LeftRel,    MSG_SCROLLME},    {GU_AddLeft,    INTERWIDTH},
  212.     {GU_Flags,        PLACETEXT_ABOVE|NG_HIGHLABEL},
  213.     {GU_TopRel,        MSG_SELECTITEM},{GU_AdjustTop,    INTERHEIGHT},
  214.     {GU_AlignBottom,MSG_SCROLLME},    {GU_AlignRight,    MSG_SELECTITEM},
  215.     {TAG_MORE,        (ULONG)StdGadTags}
  216. };
  217.  
  218. struct TagItem PaletteGTTags[] = {
  219.     {GTPA_Depth,    2},                {GTPA_IndicatorWidth,    36},
  220.     {TAG_MORE,        (ULONG)StdGTTags}
  221. };
  222.  
  223. struct LayoutGadget gadgets[] = {
  224.     { MSG_NEXTDRIVE,    NextDriveGad,    StdGTTags,        NULL },
  225.     { MSG_PREVDRIVE,    PrevDriveGad,    StdGTTags,        NULL },
  226.     { MSG_DRIVE,        DriveGad,        DriveGTTags,    NULL },
  227.     { MSG_REQUESTER,    ReqGad,            StdGTTags,        NULL },
  228.     { MSG_CHECKME,        CheckBoxGad,    StdGTTags,        NULL },
  229.     { MSG_FILENAME,        FileNameGad,    StdGTTags,        NULL },
  230.     { MSG_INTEGER,        IntegerGad,        StdGTTags,        NULL },
  231.     { DRIVE_MX_GAD,        DriveMxGad,        MXGadGTTags,    NULL },
  232.     { MSG_DRAGME,        SliderGad,        SliderGTTags,    NULL },
  233.     { MSG_SELECTITEM,    ListViewGad,    LVGTTags,        NULL },
  234.     { MSG_SCROLLME,        ScrollGad,        ScrollGTTags,    NULL },
  235.     { MSG_SELECTCOL,    PaletteGad,        PaletteGTTags,    NULL },
  236.     { -1,                NULL,            NULL,            NULL }
  237. };
  238.  
  239. struct NewMenu MyNewMenu[] = {
  240.     { NM_TITLE,    (STRPTR)MNU_1_TITLE,    0,    0,    0,    0 },        /*    | Project | */
  241.     {  NM_ITEM,    (STRPTR)MNI_1_IT1,        0,    0,    0,    (APTR)1 },    /*    Open [O]    */
  242.     {  NM_ITEM,    (STRPTR)MNI_1_IT2,        0,    0,    0,    (APTR)2 },    /*    Save [S]    */
  243.     {  NM_ITEM,    NM_BARLABEL,            0,    0,    0,    0 },        /*    -----------    */
  244.     {  NM_ITEM,    (STRPTR)MNI_1_IT3,        0,    0,    0,    0 },        /*    Print...    */
  245.     {    NM_SUB,    (STRPTR)MNS_1_IT3_1,    0,    0,    0,    (APTR)3 },    /*        Draft    */
  246.     {    NM_SUB,    (STRPTR)MNS_1_IT3_2,    0,    0,    0,    (APTR)4 },    /*        NLQ    */
  247.     {  NM_ITEM,    NM_BARLABEL,            0,    0,    0,    0 },        /*  ----------- */
  248.     {  NM_ITEM,    (STRPTR)MNI_1_IT4,        0,    0,    0,    (APTR)5 },    /*  Quit [Q]    */
  249.     {    NM_END,    NULL,                    0,    0,    0,    0 }
  250. };
  251.  
  252. LONG farright, farbottom;
  253.  
  254. struct TagItem LayoutTags[] = {
  255.     {GU_RightExtreme,    (ULONG)&farright},
  256.     {GU_LowerExtreme,    (ULONG)&farbottom},
  257.     {GU_DefTextAttr,    0},
  258.     {GU_Catalog,        0},
  259.     {GU_AppStrings,        (ULONG)&AppStrings},
  260.     {TAG_DONE}
  261. };
  262.  
  263. /*-----------------------------------------------------------------*/
  264. struct Library *GadUtilBase;
  265.  
  266. struct List      LibraryList;
  267. struct Screen *screen = NULL;
  268. struct Window *main_win = NULL;
  269. APTR priv_info = NULL;
  270.  
  271. void process_window_events(struct Window *, struct Menu *);
  272. void ToggleLED(void);
  273.  
  274. main()
  275. {
  276.     struct Gadget *glist;
  277.     struct Menu *menustrip;
  278.     LibraryList = SysBase->LibList;
  279.  
  280.     LVGTTags[0].ti_Data = (ULONG)&LibraryList;
  281.  
  282.     if (GadUtilBase = OpenLibrary("gadutil.library",0))
  283.     {
  284.         LayoutTags[3].ti_Data = (ULONG)GU_OpenCatalog(catalogname,0);
  285.  
  286.         if (screen = LockPubScreen(NULL))
  287.         {
  288.             LayoutTags[2].ti_Data = (ULONG)screen->Font;
  289.  
  290.             if (priv_info = GU_LayoutGadgetsA(&glist, gadgets, screen, LayoutTags))
  291.             {
  292.                 if (main_win = OpenWindowTags(NULL,
  293.                             WA_Left,    0,
  294.                             WA_Top,        screen->Font->ta_YSize + 3,
  295.                             WA_InnerWidth, farright + LEFT_OFFSET,
  296.                             WA_InnerHeight, farbottom + TOP_OFFSET,
  297.                             WA_IDCMP,    LISTVIEWIDCMP | IDCMP_MENUPICK | CYCLEIDCMP |
  298.                                     IDCMP_REFRESHWINDOW | IDCMP_CLOSEWINDOW |
  299.                                     IDCMP_VANILLAKEY | IDCMP_RAWKEY,
  300.                             WA_Flags,    WFLG_DRAGBAR | WFLG_DEPTHGADGET |
  301.                                     WFLG_CLOSEGADGET | WFLG_ACTIVATE |
  302.                                     WFLG_SMART_REFRESH | WFLG_REPORTMOUSE,
  303.                             WA_Gadgets, glist,    WA_NewLookMenus,    TRUE,
  304.                             WA_Title,    "GadUtil library test",
  305.                             TAG_DONE))
  306.                 {
  307.                     GU_RefreshWindow(main_win, NULL);
  308.                     if (menustrip = GU_CreateLocMenuA(MyNewMenu, priv_info,
  309.                             NULL, layoutmenutags))
  310.                     {
  311.                         if (SetMenuStrip(main_win, menustrip))
  312.                         {
  313.                             process_window_events(main_win, menustrip);
  314.                             ClearMenuStrip(main_win);
  315.                         }
  316.                         GU_FreeMenus(menustrip);
  317.                     }
  318.                     CloseWindow(main_win);
  319.                 }
  320.                 GU_FreeLayoutGadgets(priv_info);
  321.             }
  322.             UnlockPubScreen(NULL, screen);
  323.         }
  324.         GU_CloseCatalog((struct Catalog *)LayoutTags[3].ti_Data);
  325.         CloseLibrary((struct Library *)GadUtilBase);
  326.     }
  327. }
  328.  
  329. void process_window_events(struct Window *win, struct Menu *menuStrip)
  330. {
  331.     struct IntuiMessage *imsg;
  332.     struct Gadget *gad, *tempgad;
  333.     struct MenuItem *item;
  334.     BOOL done = FALSE;
  335.     UWORD menunumber;
  336.     ULONG coords;
  337.  
  338.     while (!done)
  339.     {
  340.         Wait(1 << win->UserPort->mp_SigBit);
  341.  
  342.         while ((!done) && (imsg = GU_GetIMsg(win->UserPort)))
  343.         {
  344.             switch (imsg->Class)
  345.             {
  346.                 case IDCMP_GADGETUP:
  347.                     ToggleLED();
  348.                     gad = (struct Gadget *)imsg->IAddress;
  349.                     switch (gad->GadgetID)
  350.                     {
  351.                         case MSG_NEXTDRIVE:
  352.                             if (tempgad = GU_GetGadgetPtr(DRIVE_MX_GAD, gadgets) )
  353.                             {
  354.                                 if ((LONG)MXGadGTTags[2].ti_Data++ >= 3) MXGadGTTags[2].ti_Data = 0;
  355.                                 GU_SetGadgetAttrsA(tempgad, win, NULL, &MXGadGTTags[2]);
  356.                             }
  357.                             break;
  358.  
  359.                         case MSG_PREVDRIVE:
  360.                             if (tempgad = GU_GetGadgetPtr(DRIVE_MX_GAD, gadgets) )
  361.                             {
  362.                                 if ((LONG)MXGadGTTags[2].ti_Data-- <= 0) MXGadGTTags[2].ti_Data = 3;
  363.                                 GU_SetGadgetAttrsA(tempgad, win, NULL, &MXGadGTTags[2]);
  364.                             }
  365.                             break;
  366.  
  367.                         case MSG_REQUESTER:
  368.                             GU_BlockInput(win);
  369.                             Delay(50);
  370.                             GU_FreeInput(win);
  371.                             break;
  372.  
  373.                         case MSG_DRIVE:
  374.                             ToggleLED();
  375.                             break;
  376.                     }
  377.  
  378.                 case IDCMP_GADGETDOWN:
  379.                     gad = (struct Gadget *)imsg->IAddress;
  380.                     if (gad->GadgetID == DRIVE_MX_GAD)
  381.                         MXGadGTTags[2].ti_Data = imsg->Code;
  382.                     break;
  383.  
  384.                 case IDCMP_MOUSEMOVE:
  385.                     if (tempgad = GU_GetGadgetPtr(MSG_SELECTITEM, gadgets))
  386.                     {
  387.                         coords = (LONG)imsg->MouseX<<16|imsg->MouseY;
  388.  
  389.                         if (GU_CoordsInGadBox(coords,tempgad))
  390.                         {
  391.                             ToggleLED();
  392.                         }
  393.                     }
  394.                     break;
  395.  
  396.                 case IDCMP_MENUPICK:
  397.                     menunumber = imsg->Code;
  398.  
  399.                     while ((menunumber != MENUNULL) && (!done))
  400.                     {
  401.                         item = ItemAddress(menuStrip, menunumber);
  402.  
  403.                         if ( (LONG)GTMENUITEM_USERDATA(item) == 5)
  404.                             done = TRUE;
  405.  
  406.                         menunumber = item->NextSelect;
  407.                     }
  408.                     break;
  409.  
  410.                 case IDCMP_CLOSEWINDOW:
  411.                     done = TRUE;
  412.                     break;
  413.  
  414.                 case IDCMP_REFRESHWINDOW:
  415.                     GU_BeginRefresh(win);
  416.                     GU_EndRefresh(win, TRUE);
  417.                     break;
  418.             }
  419.             GT_ReplyIMsg(imsg);
  420.         }
  421.     }
  422. }
  423.